package com.tedu.API;

import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * javaSE:基础语法
 * javaOOP：面向对象编程【思路】
 * javaAPI【内置】:帮助文档【字典】,提供大量的类，抽象类，异常，错误【大概8000多个】
 *
 *              javaAPI核心:字符串，包装类，集合【泛型】，线程，多线程，IO流，Socket套接字【网络编程】
 * jdk1.8chm 帮助文档  【字典】  会查类，接口，抽象........使用
 * jdk版本---帮助文档  根据什么版本用什么文档
 *                      查String---什么包下    java.lang【不需要导包】包下
 *
 * java: 错误: 无效的源发行版：17   原因：junit---test级别【识别jdk17 】
 * 调整maven项目：自动下载：junit17版本【最高版本】
 *
 * 特点：不需要导入包，不可以被继承，字符数组，定义完毕后无法修改,可以覆盖；
 *           String是final修饰的,java字符串编码集
 *           UninCode:GBK,UTF-8,任何字符两个字节，
 * 字符串底层，封装了字符数组的算法和应用，字符数组=字符串
 * 定义:  String str="直接量";    给定值
 *       String str=new String();    创建对象s
 */
public class StringAPI {
    /**
     * jdk1.8 StringAPI类型：构造器怎么？方法怎么用？？
     * 包位置：java.lang不用
     */
    @Test
    public void testString(){
       // System.out.println("Hello word...");
        String str="字符串";
        System.out.println(str);
        char[] c={'字','符','串'};  //字符数组
        System.out.println(c);
        //一旦创建无法修改 final修饰
        String s="hello word";
        s="hei";  //无法修改，只能覆盖
        System.out.println(s);
    }
    /**
     * String常量池
     *  好处：减少内存的开销，提高性能
     *       String str="133";
     *                  静态字符串【字面量，死值，常量，连接后的结果】
     *      创建在String常量池里面，对于重复的字符串就提取，不存在就放入
     *
     * JVM在虚拟机当中开辟一块空间，会在虚拟机的堆内存当中开辟，保存曾经使用过的字面量/常量
     *  一旦后面使用相同的字面量和常量，不会创建对象，会使用之前的老对象
     *
     */
    @Test
    public void testStrings(){
        String s1="java123";   //放入公共的常量池中【常量池在堆当中】
        String s2="java123";   //不会创建对象，从常量池里面找一下，有抓出来，没有放入常量池
        System.out.println(s1.equals(s2));
        String s="java";  //s不可以修改
        String s3="123"+s;  //s3对象=s对象+s3  s3是新对象
        System.out.println(s3.equals(s1)); //false    //常量放入常量池里，如果已经存在，下一个相同的常量不会创建，而是引用【地址相同】
        String s4="java"+"123";  //右侧位直接量的拼接，静态字符串，放入常量池中
        System.out.println(s2==s4); //true s4拼接完后在常量池中寻找
        //s2的java123从常量池中寻找，
        //上面对象给定值，拥有常量池功能
        //下面的代码：创建字符串的方式:创建新对象的时候使用；
        String s5=new String("java123");  //new出来的是对象，不存在常量池
        System.out.println(s4==s5);  //false

    }
    /**
     * String API 方法
     *  length方法 返回值:int  返回当前字符串的长度【个数】--借鉴于数组的length方法
     *  特点： 字符串包含：特殊字符，空格，字母，汉字
     *        String采用Unicode编码集，每个字符算一个，占两个字节
     */
     @Test
    public void testLength(){
         String str="hello word>>>>";
         System.out.println(str.length());
         str=" 我爱 ";
         System.out.println(str.length());
     }
    /**
     * indexOf方法-----重载功能： 修饰符 返回值 方法名不一致
     *                                       参数不一样
     * indexOf(String index)
     * 第一个参数 String index：传入下标位
     * 作用： 查找指定字符串在当前字符串的位置，
     *           首位置,如果是匹配到字符，会输出首位子的下标，
     *                 如果没有匹配，返回值为-1
     *
     * indexOf(String str,int index) 返回值: int
     * 第一个参数 String str:传入指定字符串
     * 第二个参数 int index :查找指定位置的下标
     * 作用：查找具体下标位的字符串在当前字符串的位置，首位置，如果没有匹配，返回值为-1
     *      如果查找相同的名称：向下查找，不包含当前位置
     *
     * lastIndexOf(string str):
     *  作用：找到匹配字符串中对应的最后的出现字符串的位置
     */
     @Test
    public void testIndexOf(){
         String str="thinking in java";
         //返回值是具体的下标位
         int index=str.indexOf("jv");  //用处查找第一位相同的字符串
         System.out.println("打印下标位"+index);

         index=str.indexOf("in",3); //查找某一位字符串
         System.out.println("指定下标位"+index);
         //lastIndexOf()找到最后一次出现的下标位置
         index=str.lastIndexOf("in");
         System.out.println("最后的下标位"+index);

     }
    /**
     * String 的三中方法:截取，替换，分割
     * subString方法 截取  返回值 string
     * subString(int start,int end)
     * 作用:截取字符串,从下标start的位置开始截取,截取到end小标位置
     * subString(int index)
     * 作用:从下标index位置开始截取,截取到最后
     * 口诀：含头不含尾
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";//截取字符串中的百度
       // url=url.substring(9,12);  //截取的子字符串 3,10
        System.out.println("截取子字符串"+url);
        //截取到.com
        url=url.substring(9); //二次截取
        System.out.println("截取到最后"+url);
    }
    /**
     * charAt(int index)方法 返回值 char
     * 作用：返回字符串当中指定位置中的字符
     *java.lang.StringIndexOutOfBoundsException  异常
     *字符串下标越界异常--出现问题，下标超出范围
     */
    @Test
    public void testCharAt(){
        String str="think in java";
        char c=str.charAt(9);
        System.out.println("获取对应的字符"+c);
    }
    /**
     * trim方法 返回值 String
     * 作用：去掉当前字符串的前后空格【转大小写叠加】
     * 同一转换大小写，去掉空格之后
     *
     * toLowerCase方法 返回值String
     * 将所有字符串转换为小写
     * toUpperCase方法 返回值String
     * 将所有字符串转大写
     * 验证码：xD4e xD4e   xd4e
     *
     */
    @Test
    public void testTrim(){
        String str=" xD4e ";  //后台传入的是都加空格，xD4e判断
        //后台传入前台字符串--一律去空格
        str=str.trim().toLowerCase();
        str=str.trim().toUpperCase();
        System.out.println("去掉空格"+str);

    }
    /**
     * 【php】正则表达式：语法-元字符 ^开始 [0-9]*$结束
     *
     * matches方法
     * 作用：用于验证字符串，使用正则表达式验证【过滤字符】
     *       返回：true验证通过 false 验证错误
     *
     */
    public static void main(String[] args) {
        String regex="^[0-9a-zA-Z]*$";
        System.out.println("请输入");
        //从控制台输入【模拟用户输入】
        Scanner input=new Scanner(System.in);
        //判断，如果正则通过，返回数字，反之相反
        if(input.nextLine().matches(regex)){
            System.out.println("是数字");
        }else{
            System.out.println("非数字");
        }

    }
    /**
     * replace方法 返回值：String
     * replace(String a,String b)
     * 第一个参数 String a 查找替换字符
     * 第二个参数 String b 替换的字符
     * 作用：用于匹配字符串中存在的字符，匹配成功，替换成新的字符
     *
     * replaceAll(String regex,String a)
     * 作用：按照正则匹配，换成新字符
     */
    @Test
    public void testReplace(){
        String str="我爱java";  //将java替换成python
        str=str.replace("java","python");
        System.out.println("替换后的字符串"+str);

        String regex="^[\\u4e00-\\u9fa5]*$\n";//验证是否是汉字
        String say="买了个标";
        say.replaceAll(regex,"****");
        System.out.println("正则替换后的字符串"+say);
    }

    /**
     * split方法 分割 返回值：String[]
     * 作用：用于按照“正则”或者“字符串”的方式分割字符串
     * www.baidu.com 按照.的方式获取
     * split写. :正则表达式：. 匹配一个字符
     * split写. 转义成.   \\.
     */
    @Test
    public void testSplit(){
        String url="www.baidu.com";  //不知道下标的情况下，获取baidu
        String[] urls=url.split("\\.");
        System.out.println(" 获取的元素值"+urls[1]);
        //java.lang.ArrayIndexOutOfBoundsException 数组小标越界问题
        //解决：打印数组字符串，增强for   for(数组数据类型 引用:遍历数组的引用)
        for(String s:urls){
            System.out.println("分割后的数组"+s);
        }

    }
    /**
     * valueOf() 静态方法:通过类名进行访问 返回值 String
     * 作用：基础数据类型转换为字符串
     */
    @Test
    public void testValueOf(){
        int i=123;   //将当前的数据类型转换为字符串
        String s=String.valueOf(i);
        if(s.equals("123")){
            //s对象=="123"  判断对象 false
            //s.对象.equals（"123"） 判断值
            System.out.println("是字符串");
        }else{
            System.out.println("是字符串");
        }

    }

}
